package com.soulmate.product.service;

import common.pojo.Product;
import common.utils.MapperUtil;
import common.vo.EasyUIResult;
import com.soulmate.product.mapper.ProductMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import redis.clients.jedis.JedisCluster;

import java.util.List;
import java.util.UUID;

@Service
public class ProductServiceImpl implements ProductService {
    @Autowired
    private ProductMapper productMapper=null;

    @Autowired
    private JedisCluster cluster=null;

    @Override
    public EasyUIResult queryEasyUIResult(Integer page, Integer rows) {
        EasyUIResult easyUIResult=new EasyUIResult();
        //总记录条数
        Integer total=productMapper.queryTotal();
        easyUIResult.setTotal(total);
        //当面页面的记录列表
        //--start
        Integer start=rows*(page-1);
        List<Product> productList=productMapper.queryByPageRows(start,rows);
        /*System.out.println(productList);*/
        easyUIResult.setRows(productList);
        return easyUIResult;
    }

    @Override
    public Product findProductById(String productId) {
        //缓存逻辑
        //准备一个操作缓存数据的key值
        String prodKey="product_query_"+productId;
        //判断是否有更新的锁
        String prodLock="product_query_"+productId+".lock";
        if (cluster.exists(prodLock)){
            //说明有人更新，不需要操作缓存redis--直接从数据库获取
            return productMapper.findProductById(productId);
        }
        //判断缓存redis存在
        try {
            if (cluster.exists(prodKey)){
                //说明存在缓存数据
                String pJson=cluster.get(prodKey);
                //转换为对象
                Product p= MapperUtil.MP.readValue(pJson,Product.class);
                return p;
            }else {
                //缓存没有数据
                Product p=productMapper.findProductById(productId);
                //生成商品对象的缓存value存储缓存
                String pJson=MapperUtil.MP.writeValueAsString(p);
                cluster.set(prodKey,pJson);
                return p;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    @Override
    public void addProduct(Product product) {
        //没有商品id UUID实现
        String productId = UUID.randomUUID().toString();
        product.setProductId(productId);
        //商品数据加入缓存
        //准备一个操作缓存数据的key值
        try {
            String prodKey="product_query_"+productId;
            //生成商品对象的缓存value存储缓存
            String pJson=MapperUtil.MP.writeValueAsString(product);
            //把商品字符串存入缓存。。。
            cluster.set(prodKey,pJson);
        } catch (Exception e) {
            e.printStackTrace();
        }

        productMapper.addProduct(product);

    }

    @Override
    public void updateProduct(Product product) {
        //删除原有缓存
        String prodKey="product_query_"+product.getProductId();
        String prodLock="product_query_"+product.getProductId()+".lock";
        cluster.set(prodLock,"");
        cluster.del(prodKey);
        productMapper.updateProduct(product);
        cluster.del(prodLock);
    }
}
